<?php

/**
 * Created by PhpStorm.
 * User: merlin
 * Date: 15-7-31
 * Time: 下午6:33
 */
class MerlinEncrypt {

    /**
     * 加密过程
     * @param $data 待加密的用户数据
     * @param $key 约定的加密串
     * @param $client_secret 公钥
     * @return string
     */
    public static function encryption($data,$key,$client_secret){
        //用户数据处理
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

        $plaintext = json_encode($data);

        $encrypt_text = $iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$plaintext,MCRYPT_MODE_CBC,$iv);

        $payload = base64_encode($encrypt_text);

        //签名数据处理
        $encoded_sig = base64_encode(sha1($payload.$client_secret));

        $signed_request = $encoded_sig.'.'.$payload;

        return $signed_request;
    }

    //解密过程
    /**
     * @param $signed_request 待解密的请求数据
     * @param $client_secret 公钥
     * @param $key  约定的加密串
     * @return bool|mixed
     */
    public static function decryption($signed_request, $client_secret,$key){
        //拆分 获取签名和 用户数据  两部分数据 使用  "." 连接
        list($encoded_sig, $payload) = explode('.', $signed_request, 2);

        //对签名 base64 解码
        $sig = base64_decode($encoded_sig);

        //对用户信息数据进行 base64 解码 json 解码获取用户信息字典
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $de_payload = base64_decode($payload);
        $iv_dec = substr($de_payload, 0, $iv_size);
        $ciphertext_dec = substr($de_payload, $iv_size);
        $data_json = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$ciphertext_dec,MCRYPT_MODE_CBC,$iv_dec);
        $data = json_decode(rtrim($data_json,"\0"),true);

        //比较签名是否正确验证
        $expected_sig = sha1($payload.$client_secret);

        //如果签名合法则返回数据否则返回 false
        return (strtolower($sig) !== strtolower($expected_sig))? false : $data;
    }


}